istio Authorization 拒絕指定檔案瀏覽
前言
接到個需求,要限定網站的某個副檔名不能被瀏覽。
正文
Authorization-policy的yaml
Rule規則分成三大塊
From
請求來源
To
請求目的
When
指定的請求附加條件
To
nginx查一下,是有類似的東西。
但istio我看了官方文件,
寫法是
- to:
- operation:
paths: ["/user/profile/*"]
目前只有支援單個 *
- Exact match:
abc
will match on valueabc
.
完全匹配:abc
將匹配值abc
。 - Prefix match:
abc*
will match on valueabc
andabcd
.
前綴匹配:abc*
將匹配值abc
和abcd
。 - Suffix match:
*abc
will match on valueabc
andxabc
.
後綴匹配:*abc
將匹配值abc
和xabc
。 - Presence match:
*
will match when value is not empty.
存在匹配:當值不為空時,*
將匹配。
現在的目標是要阻擋 index-erscvs.js.map ,禁止任何人觀看。
但 index-erscvs.js 不能被deny
於是
kind: AuthorizationPolicy
metadata:
name: frontend-map-policy
spec:
selector:
matchLabels:
group: frontend
action: DENY
rules:
- to:
- operation:
hosts: ["abc.def.com"]
ports: ["80"]
paths: ["*.js.map"]
優先順序評估表 Custom > Deny > Allow
ref. Authorization Policy
When
注意,values不支援CIDR,需用* 代替私有網段
這邊沿用 186. istio的Authorization policy(白名單) 的方式,
設定白名單。
於是,下面的設定方式,label 是 group=frontend的deploy,
不允許訪問*.js.map
的檔案,除了來源是 123.123.123.123
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: frontend-map-policy
spec:
selector:
matchLabels:
group: frontend
action: DENY
rules:
- to:
- operation:
hosts: ["abc.def.com"]
ports: ["80"]
paths: ["*.js.map"]
when:
- key: request.headers[X-Envoy-External-Address]
notValues:
- "123.123.123.123"
驗證時,可以用下面的指令協助查詢,
要注意是不是被其他的policy影響了
# 先開啟debug模式,資訊比較多,查完後將deploy重啟即可
istioctl proxy-config log deploy/httpbin --level "rbac:debug" | grep rbac
for i in {1..20}; do curl -H 'Cache-Control: no-cache, no-store' https://abc.def.com/assets/index-d74bceac.js -s -o /dev/null -w "%{http_code}\n"; done
kubectl logs <pod name> -c istio-proxy
注意
when 跟 to 如果用 下面方式的話,表示是兩條規則
...
- to:
...
- when:
...
這樣才是同一條規則,
我犯了這個蠢錯誤
- to:
...
when:
...
ref.